package cn.jcet.hdfs;

import cn.jcet.utils.HDFSUtils;
import com.jcraft.jsch.IO;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;

import java.io.*;

/**
 * @author 鲜磊
 * @Date 2020/11/23 23:40
 */
public class HDFSIO {
    @Test
    public void testFilePut() throws Exception {
        // 获取系统文件
        FileSystem fs = HDFSUtils.getConnection();
        //  创建输入流
        FileInputStream fis = new FileInputStream(new File("d:/index_banner.ftl"));
        // 获取输出流
        FSDataOutputStream fos = fs.create(new Path("/index_banner.ftl"));
        //流对拷
        IOUtils.copyBytes(fis,fos,fs.getConf());
        //关闭资源
        IOUtils.closeStream(fos);
        IOUtils.closeStream(fis);
        fs.close();
    }

    @Test
    public void testFileDownload() throws IOException {
        // 获取文件系统
        FileSystem fs = HDFSUtils.getConnection();
        // 输入
        FSDataInputStream fis = fs.open(new Path("/index_banner.ftl"));
        //输出
        FileOutputStream fos = new FileOutputStream(new File("d:/index_banner11.ftl"));
        // 流对拷
        IOUtils.copyBytes(fis,fos,fs.getConf());
        //关闭资源
        IOUtils.closeStream(fos);
        IOUtils.closeStream(fis);
        fs.close();
    }


    /**
     * 下载快的大小 下载第一部分大小 1024*1024*128  = 128M
     *  1024*1024*60.5 = 60M
     */
    @Test
    public void testOneDownload() throws IOException {
        // 获取文件系统
        FileSystem fs = HDFSUtils.getConnection();
        // 输入流
        FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));
        // 输出流 到本地磁盘中
        FileOutputStream fos = new FileOutputStream(new File("d:/hadoop-2.7.2.tar.gz.part1"));
        // 读取块的128M大小
        // 设置一个1024的字节数组大小 作为一个缓存区
        byte [] buf = new byte[1024];
        Integer number = 1024;
        // 重复执行 1024*1024*128 次
        for (int i = 0; i < number * 128; i++) {
            // 输入读取
            fis.read(buf);
            // 输出流写
            fos.write(buf);
        }
        // 关闭资源
        IOUtils.closeStream(fos);
        IOUtils.closeStream(fis);
        fs.close();
    }

    /**
     * 下载第二块文件 指定下载位置
     */
    @Test
    public void testIndexDownload() throws IOException {
        // 获取连接
        FileSystem fs = HDFSUtils.getConnection();
        // 输出流
        FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));
        // 指定读取位置 128M开始读取
        fis.seek(1024*1024*128 );
        // 输出流
        FileOutputStream fos = new FileOutputStream(new File("d:/hadoop-2.7.2.tar.gz.part2"));
        // 流的对拷
        IOUtils.copyBytes(fis,fos,fs.getConf());
        // 关闭资源
        IOUtils.closeStream(fos);
        IOUtils.closeStream(fis);
        fs.close();
    }
}
